/*
* @axiosClass.js
* @description axios的二次封装
* @author chenzhihui
* @update (chenzhihui 2019/3/26)
*/
import axios from 'axios'
import {Loading, Message} from 'element-ui'

class axiosFunc {
    constructor() {
        this.loading = null;
    }

    /*************************************读取配置文件***********************************/
    /**
     * @param url 读取的json 配置文件地址
     * @returns {Promise<any>}
     */
    readConfig(url) {
        return new Promise((resolve, reject) => {
            axios.get(url).then(res => {
                resolve(res);
            });
        });
    }

    /*************************************初始化创建axios，设置get和post方法******************************************/
    /**
     * @param baseUrl 基础后台url
     * @param useInterceptors 是否启用拦截器
     * @returns {{post: (function(*=, *=): Promise<any>), get: (function(*=, *=): Promise<any>)}}
     */
    createAxios(baseUrl, useInterceptors) {
        let serviceObj = {};
        let that = this;
        //创建一个axios
        serviceObj = this.creatServiceByZh(serviceObj, baseUrl, useInterceptors);
        return {
            get: function (url, params) {
                that.startLoading()
                return new Promise((resolve, reject) => {
                    serviceObj.get(url, {params: params})
                        .then((res) => {
                            that.endLoading()
                            if(res.data.success){
                                resolve(res)
                            }else{
                                Message({
                                    message: res.data.message,
                                    type: 'warning'
                                })
                            }
                            resolve(res)
                        })
                        .catch(err => {
                            that.endLoading();
                            Message({
                                message: '服务器错误！',
                                type: 'error'
                            })
                            console.error(err)
                            reject(err)
                        })
                });
            },
            post: function (url, params,...otherParams) {
                that.startLoading()
                return new Promise((resolve, reject) => {
                    if(!otherParams){
                        otherParams = [{}]
                    }
                    serviceObj.post(url, params,otherParams[0])
                        .then((res) => {
                            that.endLoading()
                            if(res.data.success){
                                resolve(res)
                            }else{
                                Message({
                                    message: res.data.message,
                                    type: 'warning'
                                })
                            }
                        }).catch(err => {
                        that.endLoading();
                        Message({
                            message: '服务器错误！',
                            type: 'error'
                        })
                        console.error(err)
                        reject(err)
                    })
                });
            },
        }
    }

    /*************************************Element-UI的loading动画**********************************/
    //启用动画
    startLoading() {
        this.loading = Loading.service({
            lock: true,
            text: '加载中....',
            background: 'rgba(0, 0, 0, 0.7)'
        })
    }

    //关闭动画
    endLoading() {
        this.loading.close()
    }

    /*************************************创建axios*************************************************/

    /*
     * 若项目需要连接多个后台
     * 则可以创建多个，并单独设置默认属性（如默认url等）
     * */
    /**
     * @param obj axis对象
     * @param baseUrl 基础访问后台地址
     * @param useInterceptors 是否使用拦截器
     * @returns {*}
     */
    creatServiceByZh(obj, baseUrl, useInterceptors) {
        obj = axios.create({
            baseURL: baseUrl,
        })
        obj = this.setToken(obj)
        obj = this.setOther(obj)
        if (useInterceptors) {
            obj = this.setReqInterceptors(obj);
            obj = this.setResInterceptors(obj);
        }

        return obj;
    }


    /***********************设置ContentType等(这里时保留项目里旧的axios.js脚本里的方法)****************/
    /**
     * @param obj axios对象
     * @returns {*}
     */
    setOther(obj) {
        obj.defaults.headers.post["Content-Type"] = "application/json";
        obj.defaults.headers.get["Content-Type"] = "application/json;charset=UTF-8;";
        /*obj.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
        obj.defaults.transformRequest = [function (data) {
            let ret = ''
            for (let it in data) {
                ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
            }
            return ret
        }];*/
        return obj;
    }

    /*************************************设置Token********************************************/
    /**
     * @param obj axios对象
     * @returns {*}
     */
    setToken(obj) {
        //从缓存读取token进行设置;
        let userInfo = JSON.parse(localStorage.getItem('userInfo'))
        if (userInfo && userInfo.token) {
            obj.defaults.header.common['token'] = userInfo.token;
        }
        return obj;
    }

    /*************************************设置请求拦截器********************************************/
    /**
     * @param obj axios对象
     * @returns {*}
     */
    setReqInterceptors(obj) {
        obj.interceptors.request.use(config => {
            //获取本地token
            //let TOKEN = window.localStorage.getItem("TOKEN")
            //若token存在则将其放入head中
            /*if(undefined !==TOKEN && '' !== TOKEN.trim()){
                config.headers.TOKEN=TOKEN
            }*/
            this.startLoading();
            return config;
        }, error => {
            console.log(error);
            return Promise.reject();
        })
        return obj;
    }


    /*************************************设置响应拦截器****************************************/

    /*
     * 项目中token是登录时返回的数据
     * 这里获取token的方法暂时用不到
     **/
    /**
     * @param obj axios对象
     * @returns {*}
     */
    setResInterceptors(obj) {
        obj.interceptors.response.use(response => {
            //获取服务器给予的token并存储
            /*let TOKEN = res.headers.TOKEN =TOKEN;
            if(undefined !==TOKEN && '' !== TOKEN.trim()){
                window.localStorage.setItem("TOKEN",TOKEN)
            }*/
            if (response.status === 200) {
                this.endLoading();
                return response;
            } else {
                Promise.reject();
                this.endLoading();
            }
        }, error => {
            console.log(error);
            this.endLoading();
            return Promise.reject();
        })
        return obj;
    }
}

export default axiosFunc

